/******************************************************************************* * Copyright (c) 2008 Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is made available under the terms of the * Eclipse Public License v1.0 which accompanies this distribution, * and is available at http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.smooks.configuration.editors.csv12; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.InputStream; import java.lang.reflect.InvocationTargetException; import java.nio.charset.Charset; import java.util.Iterator; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.transform.dom.DOMResult; import javax.xml.transform.stream.StreamSource; import org.jboss.tools.smooks.configuration.editors.utils.SmooksUIUtils; import org.jboss.tools.smooks.configuration.editors.xml.TagList; import org.jboss.tools.smooks.configuration.editors.xml.XMLObjectAnalyzer; import org.jboss.tools.smooks.model.csv12.CSV12Reader; import org.jboss.tools.smooks.model.smooks.AbstractReader; import org.jboss.tools.smooks.model.smooks.SmooksResourceListType; import org.milyn.Smooks; import org.milyn.csv.CSVReaderConfigurator; import org.w3c.dom.Document; /** * @author Dart (dpeng@redhat.com) * */ public class CSVDataParser { public static final String LINK_CSV_READER = "linkCSVReader"; //$NON-NLS-1$ public static final String SEPARATOR = "separator"; //$NON-NLS-1$ public static final String QUOTECHAR = "quoteChar"; //$NON-NLS-1$ public static final String SKIPLINES = "skiplines"; //$NON-NLS-1$ public static final String ENCODING = "encoding"; //$NON-NLS-1$ public static final String FIELDS = "fields"; //$NON-NLS-1$ public static final String ROOT_ELEMENT_NAME = "rootElementName"; //$NON-NLS-1$ public static final String RECORD_NAME = "recordName"; //$NON-NLS-1$ public TagList parseCSV(String filePath, SmooksResourceListType resourceList) throws FileNotFoundException, InvocationTargetException, ParserConfigurationException { return parseCSV(new FileInputStream(SmooksUIUtils.parseFilePath(filePath)), resourceList); } public TagList parseCSV(InputStream inputStream, Object readerObj) throws ParserConfigurationException { String fields = null; String separator = null; String quoteChar = null; String skiplines = null; String encoding = null; String rootName = null; String recordName = null; if (readerObj == null) return null; // if (readerObj instanceof CsvReader) { // CsvReader reader = (CsvReader) readerObj; // fields = reader.getFields(); // separator = reader.getSeparator(); // skiplines = reader.getSkipLines().toString(); // quoteChar = reader.getQuote(); // encoding = reader.getEncoding(); // } if (readerObj instanceof CSV12Reader) { CSV12Reader reader = (CSV12Reader) readerObj; fields = reader.getFields(); separator = reader.getSeparator(); skiplines = reader.getSkipLines().toString(); quoteChar = reader.getQuote(); encoding = reader.getEncoding(); rootName = reader.getRootElementName(); recordName = reader.getRecordElementName(); } return this.parseCSV(inputStream, fields, rootName, recordName, separator, quoteChar, skiplines, encoding); } public TagList parseCSV(InputStream stream, SmooksResourceListType resourceList) throws ParserConfigurationException { List<AbstractReader> readers = resourceList.getAbstractReader(); int count = 0; int index = -1; for (Iterator<?> iterator2 = readers.iterator(); iterator2.hasNext();) { AbstractReader abstractReader = (AbstractReader) iterator2.next(); if ( abstractReader instanceof CSV12Reader) { count++; if (index == -1) { index = readers.indexOf(abstractReader); } } } if (count > 1) { // throw new // RuntimeException("The smooks config file should have only one JSON reader"); } if (index != -1) { return parseCSV(stream, readers.get(index)); // return parseJsonFile(stream, (JsonReader) // readers.get(index)); } return null; } public TagList parseCSV(String filePath, String fields, String rootName, String recordName, String separator, String quoteChar, String skiplines, String encoding) throws FileNotFoundException { return parseCSV(new FileInputStream(filePath), fields, rootName, recordName, separator, quoteChar, skiplines, encoding); } public TagList parseCSV(InputStream stream, String fields, String rootName, String recordName, String separator, String quoteChar, String skiplines, String encoding) { Smooks smooks = new Smooks(); // SmooksResourceConfiguration readerConfig = new // SmooksResourceConfiguration("org.xml.sax.driver", // CSVReader.class.getName()); // if ((quoteChar == null) || (encoding == null) || (fields == null)) { // return null; // } // if (quoteChar == null) // quoteChar = "\""; //$NON-NLS-1$ // if (skiplines == null) // skiplines = "0"; //$NON-NLS-1$ // if (encoding == null) // encoding = "UTF-8"; //$NON-NLS-1$ CSVReaderConfigurator readerConfigurator = new CSVReaderConfigurator(fields); if (separator != null && separator.length() >= 1) { readerConfigurator.setSeparatorChar(separator.toCharArray()[0]); } if (quoteChar != null && quoteChar.length() >= 1) { readerConfigurator.setQuoteChar(quoteChar.toCharArray()[0]); } if (skiplines != null) { try { readerConfigurator.setSkipLineCount(Integer.parseInt(skiplines)); } catch (Throwable t) { } } if (rootName != null) { readerConfigurator.setRootElementName(rootName); } if (recordName != null) { readerConfigurator.setRecordElementName(recordName); } readerConfigurator.setEncoding(Charset.forName(encoding)); // readerConfigurator.setIndent(indent) smooks.setReaderConfig(readerConfigurator); DOMResult result = new DOMResult(); smooks.filterSource(new StreamSource(stream), result); Document document = (Document) result.getNode(); XMLObjectAnalyzer analyzer = new XMLObjectAnalyzer(); TagList tagList = analyzer.analyze(document, null , null); try { if (smooks != null) { smooks.close(); smooks = null; } if (stream != null) { stream.close(); stream = null; } result = null; } catch (Throwable t) { t.printStackTrace(); } return tagList; } }